package com.scala.spark

import org.apache.spark.sql.{Row, SparkSession}

object TestSparkSession {
    case class Person(name:String,age:Long)
    case class Record(key: Int, value: String)

    def main(args: Array[String]): Unit = {
        val spark=SparkSession.builder().appName("Example")
            .master("local")
            .enableHiveSupport()
            .getOrCreate()
        import spark.implicits._
        import spark.sql
        //读取json文件，构造一个untyped弱类型的dataframe   dateframe 相当于dataset[Row]
//        val df=spark.read.json("D:\\study\\拟定新\\北风网-11【项目138讲】某团购网大型离线电商数据分析平台\\Spark从入门到精通（Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端）\\第255讲-Spark 2.0-SparkSession、Dataframe、Dataset开发入门\\文档\\people.json")
//        df.show()//打印数据
//        df.printSchema()//打印元数据
//        df.select("name").show()//select操作，untyped操作
//        df.select($"name",$"age"+1).show()//scala表达式，
//        df.filter($"age">21).show()
//        df.groupBy("age").count().show()//group操作
//
//        //基于daatframe创建临时视图
//        df.createOrReplaceTempView("people")
//        val sqDf=spark.sql("select * from people")
//        sqDf.show()


        //定义一个case class\
        //使用dataset,通常会通过case class来定义dataset数据结构 自定义类型其实就是一种强类型，typed

//        //直接基于jvm Ojbect构建dataset
//        val caseCassDs = Seq(Person("xiaoli",21)).toDS()
//        caseCassDs.show()
//
//        //基于原始数据类型来构造dataset
//        val primitiDS=Seq(1,2,3).toDS()
//        primitiDS.map(_+1).show()
//
//        //基于已有的结构化数据文件，构造dataset
//        val string = "D:\\study\\拟定新\\北风网-11【项目138讲】某团购网大型离线电商数据分析平台\\Spark从入门到精通（Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端）\\第255讲-Spark 2.0-SparkSession、Dataframe、Dataset开发入门\\文档\\people.json"
//        val personDS = spark.read.json(string).as[Person]
//        personDS.show()

        spark.sql("CREATE TABLE IF NOT EXISTS temp (key INT, value STRING)")
        spark.sql("LOAD DATA LOCAL INPATH 'wordCount' INTO TABLE temp")
        spark.sql("SELECT * FROM temp").show()
        spark.sql("SELECT COUNT(*) FROM temp").show()


        val hiveSqlDf=sql("select key,value from temp where key<10 order by key")
        val stringsDS=hiveSqlDf.map{case Row(key:Int,value:String)=>s"Key: $key, Value: $value"}
        stringsDS.show()

        val recordsDF = spark.createDataFrame((1 to 100).map(i => Record(i, s"val_$i")))
        recordsDF.createOrReplaceTempView("records")
        sql("SELECT * FROM records r JOIN temp s ON r.key = s.key").show()













    }

}





























